home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
lisp
/
kcl
/
akcl
/
akcl1615.lha
/
c
/
save_sgi4.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-30
|
9KB
|
456 lines
/* for the 4d */
/*
(c) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.
Copying of this file is authorized to users who have executed the true and
proper "License Agreement for Kyoto Common LISP" with SIGLISP.
*/
/*
unixsave.c
*/
/* When MACHINE is S3000, use fcntl.h */
#ifdef ATT
#include <fcntl.h>
#include <unistd.h>
#else
#include <sys/file.h>
#endif
#ifdef BSD
#include <a.out.h>
#endif
#ifdef VAX
#define PAGSIZ 1024
#define SEGSIZ 1024
#define TXTRELOC 0
#endif
#ifdef ISI
#endif
#ifdef SEQ
#endif
#ifdef NEWS
#define TXTRELOC 0
#endif
#ifdef IBMRT
#endif
#ifdef ATT
#include <filehdr.h>
#include <aouthdr.h>
#include <scnhdr.h>
#include <syms.h>
#define exec aouthdr
#define a_text tsize
#define a_data dsize
#define a_bss bsize
#endif
#ifdef E15
#include <a.out.h>
extern etext;
#define exec bhdr
#define a_text tsize
#define a_data dsize
#define a_bss bsize
#define a_syms ssize
#define a_trsize rtsize
#define a_drsize rdsize
#define SEGSIZ (128*1024)
#define TXTRELOC (1024*1024)
#endif
#ifndef mips
filecpy(to, from, n)
FILE *to, *from;
register int n;
{
char buffer[BUFSIZ];
for (;;)
if (n > BUFSIZ) {
fread(buffer, BUFSIZ, 1, from);
fwrite(buffer, BUFSIZ, 1, to);
n -= BUFSIZ;
} else if (n > 0) {
fread(buffer, 1, n, from);
fwrite(buffer, 1, n, to);
break;
} else
break;
}
#endif
memory_save(original_file, save_file)
char *original_file, *save_file;
{
#ifdef BSD
struct exec header;
int stsize;
#endif
#ifdef ATT
#ifdef mips
struct {
struct filehdr filehdr;
struct aouthdr aouthdr;
struct scnhdr
text_section,
init_section,
rdata_section,
data_section,
lit8_section,
lit4_section,
sdata_section,
sbss_section,
bss_section;
} hdrs;
struct filehdr *pfilehdr;
struct aouthdr *paouthdr;
struct scnhdr *pscnhdr;
char buf[BUFSIZ];
HDRR symhdr;
int fptr, nbytes, pagesize;
#define setbuf(stream,buf)
#else
struct filehdr fileheader;
struct exec header;
#endif /* mips */
int diff;
#endif
#ifdef E15
struct exec header;
#endif
char *data_begin, *data_end;
int original_data;
FILE *original, *save;
register int n;
register char *p;
extern char *sbrk();
extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
fclose(stdin);
original = fopen(original_file, "r");
if (stdin != original || original->_file != 0) {
fprintf(stderr, "Can't open the original file.\n");
exit(1);
}
setbuf(original, stdin_buf);
fclose(stdout);
unlink(save_file);
n = open(save_file, O_CREAT|O_WRONLY, 0777);
if (n != 1 || (save = fdopen(n, "w")) != stdout) {
fprintf(stderr, "Can't open the save file.\n");
exit(1);
}
setbuf(save, stdout_buf);
#ifdef BSD
fread(&header, sizeof(header), 1, original);
#ifdef VAX
data_begin
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef SUN
data_begin
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef SUN2R3
data_begin = (char *)N_DATADDR(header);
#endif
#ifdef SUN3
data_begin = (char *)N_DATADDR(header);
#endif
#ifdef NEWS
data_begin
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
#endif
#ifdef ISI
#endif
#ifdef SEQ
#endif
#ifdef IBMRT
#endif
data_end = core_end;
original_data = header.a_data;
header.a_data = data_end - data_begin;
header.a_bss = 0;
fwrite(&header, sizeof(header), 1, save);
#ifdef VAX
if (header.a_magic == ZMAGIC)
filecpy(save, original, PAGSIZ - sizeof(header));
filecpy(save, original, header.a_text);
#endif
#ifdef SUN
if (header.a_magic == ZMAGIC)
filecpy(save, original, PAGSIZ - sizeof(header));
filecpy(save, original, header.a_text);
#endif
#ifdef SUN2R3
filecpy(save, original, header.a_text - sizeof(header));
#endif
#ifdef SUN3
filecpy(save, original, header.a_text - sizeof(header));
#endif
#ifdef NEWS
if (header.a_magic == ZMAGIC)
filecpy(save, original, PAGSIZ - sizeof(header));
filecpy(save, original, header.a_text);
#endif
#ifdef ISI
#endif
#ifdef SEQ
#endif
#ifdef IBMRT
#endif
#endif
#ifdef ATT
#ifdef mips
# define NSCNS 4
read(0, (char*)&hdrs.filehdr, FILHSZ + AOUTHSZ);
pfilehdr = (struct filehdr*)hdrs.aouthdr.text_start;
paouthdr = (struct aouthdr*)((long)pfilehdr + FILHSZ);
pscnhdr = (struct scnhdr*)((long)paouthdr + AOUTHSZ);
pagesize = getpagesize();
hdrs.aouthdr.dsize =
((long)core_end - hdrs.aouthdr.data_start + pagesize - 1)
& ~(pagesize - 1);
hdrs.aouthdr.bss_start =
hdrs.aouthdr.data_start + hdrs.aouthdr.dsize;
hdrs.aouthdr.bsize = 0;
hdrs.filehdr.f_nscns = NSCNS;
hdrs.filehdr.f_timdat = time(NULL);
hdrs.filehdr.f_symptr = hdrs.aouthdr.tsize + hdrs.aouthdr.dsize;
bcopy((char*)pscnhdr, (char*)&hdrs.text_section, NSCNS * SCNHSZ);
hdrs.data_section.s_size = hdrs.aouthdr.dsize
- hdrs.rdata_section.s_size;
bzero((char*)&hdrs.lit8_section,
sizeof hdrs - FILHSZ - AOUTHSZ - NSCNS * SCNHSZ);
fptr = write(1, &hdrs, AOUTHSZ + FILHSZ + pfilehdr->f_nscns * SCNHSZ);
p = (char*)hdrs.aouthdr.text_start + fptr;
n = hdrs.aouthdr.tsize - fptr;
nbytes = pagesize - fptr;
write(1, p, nbytes);
p += nbytes;
n -= nbytes;
while ( n > pagesize ) {
write(1, p, pagesize);
p += pagesize;
n -= pagesize;
}
if ( n )
write(1, p, n);
lseek(1, hdrs.rdata_section.s_scnptr, SEEK_SET);
p = (char*)hdrs.aouthdr.data_start;
n = hdrs.aouthdr.dsize;
while ( n > pagesize ) {
write(1, p, pagesize);
p += pagesize;
n -= pagesize;
}
if ( n )
write(1, p, n);
lseek(0, pfilehdr->f_symptr, SEEK_SET);
diff = hdrs.filehdr.f_symptr - pfilehdr->f_symptr;
read(0, &symhdr, cbHDRR);
#define adjust(field)if(symhdr.cb/**/field/**/Offset)symhdr.cb/**/field/**/Offset+= diff
adjust(Line);
adjust(Dn);
adjust(Pd);
adjust(Sym);
adjust(Opt);
adjust(Aux);
adjust(Ss);
adjust(SsExt);
adjust(Fd);
adjust(Rfd);
adjust(Ext);
#undef adjust
write(1, &symhdr, cbHDRR);
while ( (n = read(0, buf, sizeof buf)) > 0 )
write(1, buf, n);
#else
fread(&fileheader, sizeof(fileheader), 1, original);
fread(&header, sizeof(header), 1, original);
data_begin = (char *)header.data_start;
data_end = core_end;
original_data = header.a_data;
header.a_data = data_end - data_begin;
diff = header.a_data - original_data;
header.a_bss = sbrk(0) - core_end;
fileheader.f_symptr += diff;
fwrite(&fileheader, sizeof(fileheader), 1, save);
fwrite(&header, sizeof(header), 1, save);
fread(§ionheader, sizeof(sectionheader), 1, original);
if (sectionheader.s_lnnoptr)
sectionheader.s_lnnoptr += diff;
fwrite(§ionheader, sizeof(sectionheader), 1, save);
fread(§ionheader, sizeof(sectionheader), 1, original);
sectionheader.s_size += diff;
if (sectionheader.s_lnnoptr)
sectionheader.s_lnnoptr += diff;
fwrite(§ionheader, sizeof(sectionheader), 1, save);
fread(§ionheader, sizeof(sectionheader), 1, original);
sectionheader.s_paddr += diff;
sectionheader.s_vaddr += diff;
sectionheader.s_size = header.a_bss;
#ifdef S3000
if (sectionheader.s_scnptr)
sectionheader.s_scnptr += diff;
#endif
if (sectionheader.s_lnnoptr)
sectionheader.s_lnnoptr += diff;
fwrite(§ionheader, sizeof(sectionheader), 1, save);
for (n = 4; n <= fileheader.f_nscns; n++) {
fread(§ionheader, sizeof(sectionheader), 1, original);
if (sectionheader.s_scnptr)
sectionheader.s_scnptr += diff;
if (sectionheader.s_lnnoptr)
sectionheader.s_lnnoptr += diff;
fwrite(§ionheader, sizeof(sectionheader), 1, save);
}
filecpy(save, original, header.a_text);
#endif /* mips */
#endif
#ifdef E15
fread(&header, sizeof(header), 1, original);
if (header.fmagic != NMAGIC)
data_begin
= (char *)(TXTRELOC+header.a_text);
else
data_begin
= (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
data_end = core_end;
original_data = header.a_data;
header.a_data = data_end - data_begin;
header.a_bss = sbrk(0) - core_end;
fwrite(&header, sizeof(header), 1, save);
filecpy(save, original, header.a_text);
#endif
#ifndef mips
for (n = header.a_data, p = data_begin; ; n -= BUFSIZ, p += BUFSIZ)
if (n > BUFSIZ)
fwrite(p, BUFSIZ, 1, save);
else if (n > 0) {
fwrite(p, 1, n, save);
break;
} else
break;
fseek(original, original_data, 1);
#ifdef BSD
filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
fread(&stsize, sizeof(stsize), 1, original);
fwrite(&stsize, sizeof(stsize), 1, save);
filecpy(save, original, stsize - sizeof(stsize));
#endif
#ifdef ATT
for (;;) {
n = getc(original);
if (feof(original))
break;
putc(n, save);
}
#endif
#ifdef E15
filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
#endif
#endif /* !mips */
fclose(original);
fclose(save);
}
Lsave()
{
char filename[256];
check_arg(1);
check_type_or_pathname_string_symbol_stream(&vs_base[0]);
coerce_to_filename(vs_base[0], filename);
/*
_cleanup();
*/
{
FILE *p;
int nfile;
#ifdef HAVE_GETDTABLESIZE
nfile = getdtablesize();
#else
nfile = _NFILE;
#endif
for (p = &_iob[3]; p < &_iob[nfile]; p++)
fclose(p);
}
memory_save(kcl_self, filename);
/*
_exit(0);
*/
exit(0);
/* no return */
}
#ifdef ISI
#endif